/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package uy.edu.ort.recepcionar.fuente;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.net.URL;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import org.apache.log4j.PropertyConfigurator;
import uy.edu.ort.dominio.ListaTopicos;
import uy.edu.ort.validar.noticia.ValidarFuenteSBLocal;

/**
 *
 * @author Administrador
 */
@Stateless
public class RecepcionarDatosSB implements RecepcionarDatosSBLocal {

    static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(RecepcionarDatosSB.class);
    //Inyección de dependencia
    @EJB
    private ValidarFuenteSBLocal vdLocal;   
    
    @EJB
    private ManejoTopicosSBLocal mtLocal;
    
    @Override
    public String RecibirNoticia(String noticia) {
        //recibo noticia en JSON y se envia por JMS a la cola de validar noticia
        /**
         * @param args the command line arguments
         */
        try {
//Seteo las Properties para el contexto
            Properties props = new Properties();
            props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
            props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
            props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
            props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
            props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
            //Creo el Contexto para obtener los recursos del servidor
            InitialContext ic = new InitialContext(props);
            // Obtenemos a traves del servicio JNDI la ConnectionFactory del
            // servidor de aplicaciones
            ConnectionFactory connectionFactory = (ConnectionFactory) ic.lookup("CF01");
            // Obtenemos a traves del servicio JNDI la "destination" que vamos
            // a utilizar, en este caso una Queue
            Queue queue = (Queue) ic.lookup("jms/QueueValidarNoticia");
            //Creo la Connection mediante la ConnectionFactory
            Connection connection = connectionFactory.createConnection();
            //Creo la Session mediante la Connection
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            //Creo la MessageProducer mediante la Session
            MessageProducer messageProducer = session.createProducer(queue);
            //Creo la TextMessage mediante la Session
            TextMessage textMessage = session.createTextMessage();
            textMessage.setText(noticia);
            //Envío el mensaje mediante MessageProducer
            messageProducer.send(textMessage);
            
            //FIXME: Ver si va.
            connection.close();
            return "Se envió la noticia correctamente.";
            
        } catch (Exception ex) {
            Logger.getLogger(RecepcionarDatosSB.class.getName()).log(Level.SEVERE, null, ex);
            logger.error(ex.toString());
            return "Error al publicar la noticia.";
        }
        
    }

    @Override
        public String ConsultarTopicos(String fuente) {
        //return "pueba ConsultarTopicos";
        //recibo noticia en JSON y se envia por JDNI a validar topico
            String topicos = "";
            URL url = RecepcionarDatosSB.class.getResource("log4j.properties");
            PropertyConfigurator.configure(url);
            if (vdLocal.ValidarFuente(fuente))
            {   
                logger.info("Fuente AUTORIZADA: " + fuente);
                ListaTopicos listTopicos = mtLocal.ObtenerTopicos();
    //            //ManejoJSON mj = new ManejoJSON();
//                ManejoJSON mj = null;
//                System.out.println("LLEGAAAAAA SERVIDOR 2");
//                topicos = mj.ObjetoToJSON(listTopicos);
                ObjectMapper mapper = new ObjectMapper();
                try {

                    // Generamos la salida a un archivo
                    //mapper.writeValue(new File("D:\\jsonServer.txt"), listTopicos);
                    // mostramos por consola
                    topicos = mapper.writeValueAsString(listTopicos);
                    System.out.println(topicos);
                } catch (JsonGenerationException e) {
                    e.printStackTrace();
                    logger.error(e.toString());
                } catch (JsonMappingException e) {
                    e.printStackTrace();
                    logger.error(e.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                    logger.error(e.toString());
                }
    //            Iterator<String> iterador = listTopicos.iterator();  
    //  
    //            while (iterador.hasNext()) {  
    //                String topico = iterador.next();  
    //                topicos = topicos + "-" + topico;  
    //            }
            }
            else
            {
                logger.error("Fuente NO AUTORIZADA: " + fuente);
                topicos = "Fuente inválida";
            }
            return topicos;
    
        }

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")

}
